package com.cardcaptorsakura.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.util.Map;

/**
 * API配置类
 * 管理各种外部API服务的配置信息
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "api")
public class ApiConfig {

    /**
     * OpenAI配置
     */
    private OpenAiConfig openai = new OpenAiConfig();

    /**
     * 百度AI配置
     */
    private BaiduConfig baidu = new BaiduConfig();

    /**
     * 阿里云配置
     */
    private AliyunConfig aliyun = new AliyunConfig();

    /**
     * 腾讯云配置
     */
    private TencentConfig tencent = new TencentConfig();

    /**
     * 讯飞配置
     */
    private XunfeiConfig xunfei = new XunfeiConfig();

    /**
     * Stability AI配置
     */
    private StabilityConfig stability = new StabilityConfig();

    /**
     * Midjourney配置
     */
    private MidjourneyConfig midjourney = new MidjourneyConfig();

    /**
     * 通用配置
     */
    private CommonConfig common = new CommonConfig();

    /**
     * OpenAI配置
     */
    @Data
    public static class OpenAiConfig {
        /**
         * API密钥
         */
        private String apiKey;

        /**
         * 组织ID
         */
        private String organizationId;

        /**
         * 基础URL
         */
        private String baseUrl = "https://api.openai.com";

        /**
         * 默认模型
         */
        private String defaultModel = "gpt-3.5-turbo";

        /**
         * 图像生成模型
         */
        private String imageModel = "dall-e-3";

        /**
         * 语音合成模型
         */
        private String ttsModel = "tts-1";

        /**
         * 语音识别模型
         */
        private String sttModel = "whisper-1";

        /**
         * 超时时间（秒）
         */
        private Integer timeout = 60;

        /**
         * 最大重试次数
         */
        private Integer maxRetries = 3;

        /**
         * 是否启用
         */
        private Boolean enabled = true;

        /**
         * 代理配置
         */
        private ProxyConfig proxy = new ProxyConfig();
    }

    /**
     * 百度AI配置
     */
    @Data
    public static class BaiduConfig {
        /**
         * API Key
         */
        private String apiKey;

        /**
         * Secret Key
         */
        private String secretKey;

        /**
         * 应用ID
         */
        private String appId;

        /**
         * 基础URL
         */
        private String baseUrl = "https://aip.baidubce.com";

        /**
         * 文心一言模型
         */
        private String chatModel = "ERNIE-Bot-turbo";

        /**
         * 图像生成模型
         */
        private String imageModel = "Stable-Diffusion-XL";

        /**
         * 语音合成模型
         */
        private String ttsModel = "basic";

        /**
         * 语音识别模型
         */
        private String asrModel = "pro";

        /**
         * 超时时间（秒）
         */
        private Integer timeout = 60;

        /**
         * 是否启用
         */
        private Boolean enabled = false;
    }

    /**
     * 阿里云配置
     */
    @Data
    public static class AliyunConfig {
        /**
         * Access Key ID
         */
        private String accessKeyId;

        /**
         * Access Key Secret
         */
        private String accessKeySecret;

        /**
         * 地域
         */
        private String region = "cn-hangzhou";

        /**
         * 通义千问模型
         */
        private String chatModel = "qwen-turbo";

        /**
         * 语音合成应用Key
         */
        private String ttsAppKey;

        /**
         * 语音识别应用Key
         */
        private String asrAppKey;

        /**
         * 超时时间（秒）
         */
        private Integer timeout = 60;

        /**
         * 是否启用
         */
        private Boolean enabled = false;
    }

    /**
     * 腾讯云配置
     */
    @Data
    public static class TencentConfig {
        /**
         * Secret ID
         */
        private String secretId;

        /**
         * Secret Key
         */
        private String secretKey;

        /**
         * 地域
         */
        private String region = "ap-beijing";

        /**
         * 混元模型
         */
        private String chatModel = "hunyuan-lite";

        /**
         * 语音合成模型
         */
        private String ttsModel = "basic";

        /**
         * 语音识别模型
         */
        private String asrModel = "16k_zh";

        /**
         * 超时时间（秒）
         */
        private Integer timeout = 60;

        /**
         * 是否启用
         */
        private Boolean enabled = false;
    }

    /**
     * 讯飞配置
     */
    @Data
    public static class XunfeiConfig {
        /**
         * App ID
         */
        private String appId;

        /**
         * API Key
         */
        private String apiKey;

        /**
         * API Secret
         */
        private String apiSecret;

        /**
         * 星火模型
         */
        private String chatModel = "generalv3.5";

        /**
         * 语音合成应用ID
         */
        private String ttsAppId;

        /**
         * 语音识别应用ID
         */
        private String asrAppId;

        /**
         * 超时时间（秒）
         */
        private Integer timeout = 60;

        /**
         * 是否启用
         */
        private Boolean enabled = false;
    }

    /**
     * Stability AI配置
     */
    @Data
    public static class StabilityConfig {
        /**
         * API Key
         */
        private String apiKey;

        /**
         * 基础URL
         */
        private String baseUrl = "https://api.stability.ai";

        /**
         * 默认模型
         */
        private String defaultModel = "stable-diffusion-xl-1024-v1-0";

        /**
         * 超时时间（秒）
         */
        private Integer timeout = 120;

        /**
         * 是否启用
         */
        private Boolean enabled = false;
    }

    /**
     * Midjourney配置
     */
    @Data
    public static class MidjourneyConfig {
        /**
         * API Key
         */
        private String apiKey;

        /**
         * 基础URL
         */
        private String baseUrl;

        /**
         * 服务器ID
         */
        private String serverId;

        /**
         * 频道ID
         */
        private String channelId;

        /**
         * 用户Token
         */
        private String userToken;

        /**
         * 超时时间（秒）
         */
        private Integer timeout = 300;

        /**
         * 是否启用
         */
        private Boolean enabled = false;
    }

    /**
     * 通用配置
     */
    @Data
    public static class CommonConfig {
        /**
         * 默认超时时间（秒）
         */
        private Integer defaultTimeout = 60;

        /**
         * 默认重试次数
         */
        private Integer defaultRetries = 3;

        /**
         * 重试间隔（毫秒）
         */
        private Integer retryInterval = 1000;

        /**
         * 连接池大小
         */
        private Integer connectionPoolSize = 20;

        /**
         * 最大连接数
         */
        private Integer maxConnections = 100;

        /**
         * 连接超时（毫秒）
         */
        private Integer connectionTimeout = 10000;

        /**
         * 读取超时（毫秒）
         */
        private Integer readTimeout = 30000;

        /**
         * 写入超时（毫秒）
         */
        private Integer writeTimeout = 30000;

        /**
         * 是否启用缓存
         */
        private Boolean enableCache = true;

        /**
         * 缓存过期时间（秒）
         */
        private Integer cacheExpiration = 3600;

        /**
         * 是否启用速率限制
         */
        private Boolean enableRateLimit = true;

        /**
         * 每分钟最大请求数
         */
        private Integer maxRequestsPerMinute = 60;

        /**
         * 是否启用监控
         */
        private Boolean enableMonitoring = true;

        /**
         * 监控间隔（秒）
         */
        private Integer monitoringInterval = 60;

        /**
         * 日志级别
         */
        private String logLevel = "INFO";

        /**
         * 是否记录请求响应
         */
        private Boolean logRequestResponse = false;

        /**
         * 文件上传目录
         */
        private String uploadDir = "./uploads";

        /**
         * 文件下载目录
         */
        private String downloadDir = "./downloads";

        /**
         * 临时文件目录
         */
        private String tempDir = "./temp";

        /**
         * 最大文件大小（MB）
         */
        private Integer maxFileSize = 100;

        /**
         * 允许的文件类型
         */
        private String[] allowedFileTypes = {"jpg", "jpeg", "png", "gif", "mp3", "wav", "mp4", "txt", "pdf"};
    }

    /**
     * 代理配置
     */
    @Data
    public static class ProxyConfig {
        /**
         * 是否启用代理
         */
        private Boolean enabled = false;

        /**
         * 代理类型（HTTP, SOCKS）
         */
        private String type = "HTTP";

        /**
         * 代理主机
         */
        private String host;

        /**
         * 代理端口
         */
        private Integer port;

        /**
         * 代理用户名
         */
        private String username;

        /**
         * 代理密码
         */
        private String password;
    }

    /**
     * 模型优先级配置
     */
    @Data
    public static class ModelPriority {
        /**
         * 文本生成模型优先级
         */
        private String[] textModels = {"openai", "baidu", "aliyun", "tencent", "xunfei"};

        /**
         * 图像生成模型优先级
         */
        private String[] imageModels = {"openai", "stability", "midjourney", "baidu"};

        /**
         * 语音合成模型优先级
         */
        private String[] ttsModels = {"openai", "baidu", "aliyun", "tencent", "xunfei"};

        /**
         * 语音识别模型优先级
         */
        private String[] asrModels = {"openai", "baidu", "aliyun", "tencent", "xunfei"};
    }

    /**
     * 模型优先级
     */
    private ModelPriority priority = new ModelPriority();

    /**
     * 负载均衡配置
     */
    private Map<String, Integer> loadBalancing;

    /**
     * 故障转移配置
     */
    private Map<String, String[]> failover;

    /**
     * 获取启用的文本生成服务
     */
    public String[] getEnabledTextServices() {
        java.util.List<String> enabled = new java.util.ArrayList<>();
        if (openai.getEnabled()) enabled.add("openai");
        if (baidu.getEnabled()) enabled.add("baidu");
        if (aliyun.getEnabled()) enabled.add("aliyun");
        if (tencent.getEnabled()) enabled.add("tencent");
        if (xunfei.getEnabled()) enabled.add("xunfei");
        return enabled.toArray(new String[0]);
    }

    /**
     * 获取启用的图像生成服务
     */
    public String[] getEnabledImageServices() {
        java.util.List<String> enabled = new java.util.ArrayList<>();
        if (openai.getEnabled()) enabled.add("openai");
        if (stability.getEnabled()) enabled.add("stability");
        if (midjourney.getEnabled()) enabled.add("midjourney");
        if (baidu.getEnabled()) enabled.add("baidu");
        return enabled.toArray(new String[0]);
    }

    /**
     * 获取启用的语音合成服务
     */
    public String[] getEnabledTtsServices() {
        java.util.List<String> enabled = new java.util.ArrayList<>();
        if (openai.getEnabled()) enabled.add("openai");
        if (baidu.getEnabled()) enabled.add("baidu");
        if (aliyun.getEnabled()) enabled.add("aliyun");
        if (tencent.getEnabled()) enabled.add("tencent");
        if (xunfei.getEnabled()) enabled.add("xunfei");
        return enabled.toArray(new String[0]);
    }

    /**
     * 获取服务配置
     */
    public Object getServiceConfig(String serviceName) {
        switch (serviceName.toLowerCase()) {
            case "openai":
                return openai;
            case "baidu":
                return baidu;
            case "aliyun":
                return aliyun;
            case "tencent":
                return tencent;
            case "xunfei":
                return xunfei;
            case "stability":
                return stability;
            case "midjourney":
                return midjourney;
            default:
                return null;
        }
    }

    /**
     * 检查服务是否启用
     */
    public boolean isServiceEnabled(String serviceName) {
        Object config = getServiceConfig(serviceName);
        if (config == null) return false;
        
        try {
            java.lang.reflect.Method method = config.getClass().getMethod("getEnabled");
            return (Boolean) method.invoke(config);
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 获取服务超时时间
     */
    public Integer getServiceTimeout(String serviceName) {
        Object config = getServiceConfig(serviceName);
        if (config == null) return common.getDefaultTimeout();
        
        try {
            java.lang.reflect.Method method = config.getClass().getMethod("getTimeout");
            Integer timeout = (Integer) method.invoke(config);
            return timeout != null ? timeout : common.getDefaultTimeout();
        } catch (Exception e) {
            return common.getDefaultTimeout();
        }
    }

    /**
     * 获取首选服务
     */
    public String getPreferredService(String serviceType) {
        String[] services;
        switch (serviceType.toLowerCase()) {
            case "text":
                services = priority.getTextModels();
                break;
            case "image":
                services = priority.getImageModels();
                break;
            case "tts":
                services = priority.getTtsModels();
                break;
            case "asr":
                services = priority.getAsrModels();
                break;
            default:
                return null;
        }
        
        for (String service : services) {
            if (isServiceEnabled(service)) {
                return service;
            }
        }
        
        return null;
    }

    /**
     * 验证配置
     */
    public boolean validateConfig() {
        // 检查是否至少有一个服务启用
        boolean hasEnabledService = openai.getEnabled() || 
                                   baidu.getEnabled() || 
                                   aliyun.getEnabled() || 
                                   tencent.getEnabled() || 
                                   xunfei.getEnabled() || 
                                   stability.getEnabled() || 
                                   midjourney.getEnabled();
        
        if (!hasEnabledService) {
            return false;
        }
        
        // 检查启用的服务是否有必要的配置
        if (openai.getEnabled() && (openai.getApiKey() == null || openai.getApiKey().trim().isEmpty())) {
            return false;
        }
        
        if (baidu.getEnabled() && (baidu.getApiKey() == null || baidu.getSecretKey() == null)) {
            return false;
        }
        
        // 可以添加更多验证逻辑
        
        return true;
    }
}